#include "AparecedorFicha.h"
#include "DesaparecedorFicha.h"
#include "VistaFichaTablero.h"
#include "VistaButton.h"
#include "VistaMiniBar.h"
#include "VistaGoldenStar.h"
#include <iostream>
#include <list>
#include <string>

AparecedorFicha::AparecedorFicha(std::list<Json::Value> *tableros,
                                 VistaEscenario *vista, Mutex *mu) {
    this->tableros = tableros;
    this->finAnimacion = finAnimacion;
    this->vista = vista;
    this->m = mu;
    this->desaparecedor_ficha=NULL;
}

AparecedorFicha::~AparecedorFicha() {
    if (this->desaparecedor_ficha!=NULL){
        Log::loguear(MINFO,"Liberando desaparecedor de fichas (4/4)...");
        delete desaparecedor_ficha;
        desaparecedor_ficha=NULL;
    }
}

void *AparecedorFicha::run() {
    //Json::Value fichasRamdonAux ;
    Json::Value fichasRamdon = tableros->front();


    tableros->pop_front();

    VistaFichaTablero *vistaFicha = NULL;
    int x, y;
    std::string candyName, colorName;
    for (unsigned int i = 0; i < fichasRamdon.size(); i++) {
        vistaFicha = NULL;
        x = fichasRamdon[i]["x"].asInt();
        y = fichasRamdon[i]["y"].asInt();
        candyName=fichasRamdon[i]["candy"].asString();
        colorName=fichasRamdon[i]["color"].asString();
        if (candyName == BUTTON) {
            vistaFicha = new VistaButton(colorName,false, x, y);
        } else if (candyName == MINIBARV) {
            vistaFicha = new VistaMiniBar(colorName,false, x, y, VERTICAL);
        } else if (candyName == MINIBARH) {
            vistaFicha = new VistaMiniBar(colorName, false, x, y, HORIZONTAL);
        } else if (candyName == GOLDENSTAR) {
            vistaFicha =
                    new VistaGoldenStar(colorName, false, x, y);
        } else {
            Log::loguear(MERROR, "Error: candy invalido!");
        }

        m->lock();
        if (vistaFicha!=NULL){
            vistaFicha->yDesde += 23;
            vistaFicha->xDesde += 23;
        }

        if (vista->vistaFichas[x][y]!=NULL){            
            std::stringstream ss;
            ss << "No fue liberada: " << x << "," << y;
            Log::loguear(MERROR, ss.str());
        } 
        vista->vistaFichas[x][y] = vistaFicha;
        m->unlock();
    }

    /* Las hace aparecer gradualmente */
    for (int i = 45; i >= 0; i--) {
        m->lock();
        for (unsigned int j = 0; j < fichasRamdon.size(); j++) {
            if (i % 2 == 0) {
                x = fichasRamdon[j]["x"].asInt();
                y = fichasRamdon[j]["y"].asInt();
                vista->vistaFichas[x][y]->buffer =
                                vista->vistaFichas[x][y]->obtenerImagen(i);
                vista->vistaFichas[x][y]->yDesde -= 1;
                vista->vistaFichas[x][y]->xDesde -= 1;
            }
        }
        m->unlock();
        usleep(TIEMPO_DE_REFRESCO*1000);
    }

    if (tableros->size() > 0) {
        this->desaparecedor_ficha = new DesaparecedorFicha(tableros, vista, m);
        this->desaparecedor_ficha->start();
        this->desaparecedor_ficha->join();
    } 

    this->exit();
    return NULL;
}
